Skip to main content

4-dars. Flask va uni MySQL bilan ishlatish

Darsning maqsadlari:

  1. Flask veb-ramkasining nima ekanligini tushunish.
  2. Flaskda yo'nalishlar (routes), so'rovlar (requests) va javoblar (responses) bilan ishlashni tushunish.
  3. CREATE DATABASE va CREATE TABLE yordamida ma'lumotlar bazasini yaratish.
  4. INSERT INTO yordamida ma'lumotlar bazasiga ma'lumotlar kiritish.
  5. SELECT va WHERE operatorlari yordamida ma'lumotlarni so'rash va filtrlash.
  6. UPDATE, DELETE, va DROP operatorlari haqida tushunchalar va ularni ishlatish.
  7. ALTER TABLE operatori yordamida jadvallarni o'zgartirish.
  8. SQL agregat funktsiyalaridan foydalanish: DISTINCT, SUM, COUNT, LENGTH, MAX, MIN.
  9. Ma'lumotlarni tartiblash va filtrlash uchun ORDER BY operatorini ishlatish.
  10. MySQL bazasida murakkab SQL so'rovlarini qanday yozishni o'rganish.

Kirish

Flask - bu Python dasturlash tilida yozilgan eng mashhur mikro veb-ramkalardan biri. Flask yordamida oson va tezkor veb-ilovalarni yaratish mumkin. Flask juda yengil va minimalist, bu uning o'ziga xos xususiyati hisoblanadi. Flaskni o'rganish, ayniqsa yangi boshlovchilar uchun juda oson, chunki u juda kam resurslarni talab qiladi va o'ziga xos tizimga ega. Bu ramka foydalanuvchi uchun juda qulay.


Flask nima va nima uchun ishlatiladi?

Flask - bu Python asosidagi mikro veb-ramka. Flaskning asosiy xususiyati uning yengilligi va soddaganligi. Flask bilan ishlash juda oson va siz u bilan faqat kerakli funksiyalarni qo'shish orqali o'z ilovangizni yaratishingiz mumkin.

Flaskni ishlatishning afzalliklari:

  • Yengil va oddiy: Flask o'zida faqat zarur bo'lgan imkoniyatlarni o'z ichiga oladi, shuning uchun u oson tushuniladi va tezkor ishlaydi.
  • Moslashuvchan: Flaskni istalgan darajada kengaytirish va sozlash mumkin. Dastlabki ilovadan katta tizimgacha osonlik bilan o'tish mumkin.
  • Keng jamoa: Flaskni o'rganish uchun juda ko'p resurslar mavjud, shuningdek, Flask jamoasi ham juda faol.

Flaskni ishlatish uchun sizga hech qanday murakkab server konfiguratsiyasi kerak emas. Flaskni ishlatish juda oson va shunchaki app.py fayli orqali veb-ilovalar yaratish mumkin.


Flask ilovasini yaratish

Flask ilovasini yaratish juda oson. Dastlab, Flaskni o'rnatish kerak:

pip install flask

Endi, Flaskni o'rnatganimizdan so'ng, oddiy Flask ilovasini yaratamiz:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Salom, Flask!'

if __name__ == '__main__':
app.run(debug=True)

Izoh:

  • Flask() – bu Flask ilovasini yaratadi. Flask(__name__) yordamida ilovamizni boshlaymiz.
  • @app.route('/') – bu dekorator bo'lib, u URL manzilini ('/') belgilaydi va bu manzilga kelgan so'rovlar uchun qanday funksiya chaqirilishini bildiradi. Bu holatda, / URL manziliga kirgan foydalanuvchiga 'Salom, Flask!' matni ko'rsatiladi.
  • app.run(debug=True) – Flaskni debug rejimida ishga tushirishni bildiradi, ya'ni ilova xatoliklarni ko'rsatadi va avtomatik ravishda qayta yuklanadi.

Bu ilova ishga tushganda, foydalanuvchilar localhost:5000 manzilida Salom, Flask! xabarini ko'rishadi.


So'rovlar va javoblar (Requests and Responses)

Flaskda asosiy ishlash prinsipi so'rovlar (requests) va javoblar (responses) bilan amalga oshiriladi.

  • So'rovlar (requests): Foydalanuvchi veb-sahifani ochganda yoki serverga biror ma'lumot yuborish uchun so'rov yuboradi.
  • Javoblar (responses): Server foydalanuvchi so'roviga javob beradi. Flaskda javobni return orqali beramiz.

Masalan:

from flask import Flask, request

app = Flask(__name__)

@app.route('/greet', methods=['GET'])
def greet():
name = request.args.get('name', 'Dunyo') # 'name' parametri bo'lsa, uni olamiz, aks holda 'Dunyo'
return f'Salom, {name}!'

if __name__ == '__main__':
app.run(debug=True)

Izoh:

  • request.args.get() – bu metod URL'dan parametrlarni olish uchun ishlatiladi. Masalan, /greet?name=Ali manziliga kirganda, name parametri qiymati "Ali" bo'ladi.

Flask va MySQL aloqasi

Flask dasturiga MySQL bilan aloqaga kirishish uchun mysql-connector-python kutubxonasini o'rnatish kerak. Buni pip yordamida o'rnatamiz:

pip install mysql-connector-python

CREATE DATABASE va CREATE TABLE yordamida ma'lumotlar bazasini yaratish

MySQL bilan ishlashda ma'lumotlar bazasini yaratish juda muhim birinchi qadam hisoblanadi. Flask dasturida yangi ma'lumotlar bazasini yaratish uchun quyidagi kodni yozamiz:

CREATE DATABASE

MySQLda yangi ma'lumotlar bazasini yaratish uchun CREATE DATABASE komandasidan foydalanamiz.

import mysql.connector

# MySQLga ulanish
conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword"
)
cursor = conn.cursor()

# Yangi ma'lumotlar bazasini yaratish
cursor.execute("CREATE DATABASE IF NOT EXISTS flask_example")
conn.commit()

conn.close()

Bu kodda, flask_example nomli ma'lumotlar bazasi yaratildi. Agar mavjud bo'lsa, IF NOT EXISTS sharti yordamida xatolik yuzaga kelmasligini ta'minlaymiz.

CREATE TABLE

Ma'lumotlar bazasida jadvallar yaratish uchun CREATE TABLE komandasini ishlatamiz. Misol uchun, foydalanuvchilar uchun users jadvali yaratamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Jadval yaratish
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()

Bu kodda, users nomli jadval yaratildi, unda id, username, email, va created_at kabi ustunlar mavjud.


INSERT INTO yordamida ma'lumotlar kiritish

Ma'lumotlar bazasiga ma'lumotlarni kiritish uchun INSERT INTO so'rovini ishlatamiz. Misol uchun, foydalanuvchi ma'lumotlarini kiritish uchun quyidagi kodni yozamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Foydalanuvchi qo'shish
cursor.execute("""
INSERT INTO users (username, email)
VALUES (%s, %s)
""", ("abdullajon", "abdullajon@example.com"))

conn.commit()
conn.close()

Bu kodda, users jadvaliga username va email ma'lumotlarini kiritamiz. %s operatori orqali xavfsiz tarzda ma'lumot kiritiladi, bu SQL injektsiyasining oldini oladi.


SELECT va WHERE operatorlari yordamida ma'lumotlarni so'rash va filtrlash

Ma'lumotlar bazasidan ma'lumotlarni so'rash uchun SELECT operatori ishlatiladi. Biz ushbu operatorni filtrlash uchun WHERE bilan birga ishlatamiz.

SELECT

Barcha foydalanuvchilarning ma'lumotlarini olish uchun quyidagi kodni ishlatamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Barcha foydalanuvchilarni olish
cursor.execute("SELECT * FROM users")
users = cursor.fetchall()

for user in users:
print(user)

conn.close()

Bu kodda, users jadvalidan barcha foydalanuvchilarni olamiz va ekranga chiqaramiz.

WHERE

Agar biz foydalanuvchilarni username bo'yicha qidirmoqchi bo'lsak, WHERE operatorini ishlatamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Username bo'yicha qidirish
cursor.execute("SELECT * FROM users WHERE username = %s", ("abdullajon",))
user = cursor.fetchone()

if user:
print(user)
else:
print("User not found")

conn.close()

Bu yerda, WHERE operatori orqali username qiymatini tekshiramiz. Agar foydalanuvchi mavjud bo'lsa, uning ma'lumotlarini chiqaramiz.


UPDATE operatori

UPDATE operatori yordamida ma'lumotlar bazasidagi mavjud ma'lumotlarni yangilash mumkin. Masalan, agar bizning foydalanuvchimizning email manzili o'zgargan bo'lsa, uni yangilashimiz kerak. UPDATE operatori quyidagi tarzda ishlaydi:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Foydalanuvchining emailini yangilash
cursor.execute("""
UPDATE users
SET email = %s
WHERE username = %s
""", ("abdulla@example.com", "abdullajon"))

conn.commit()
conn.close()

Bu kodda users jadvalidagi abdullajon foydalanuvchisining email manzili yangilanadi.


DELETE operatori

DELETE operatori yordamida ma'lumotlarni ma'lumotlar bazasidan o'chirish mumkin. Misol uchun, agar biz users jadvalidan biror foydalanuvchini o'chirmoqchi bo'lsak, quyidagicha so'rov yozamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Foydalanuvchini o'chirish
cursor.execute("""
DELETE FROM users
WHERE username = %s
""", ("john_doe",))

conn.commit()
conn.close()

Bu kodda users jadvalidan john_doe foydalanuvchisi o'chiriladi. Eslatma: DELETE operatori jadvallarni to'liq o'chirish uchun ishlatilmaydi, faqat ma'lumotlarni o'chirish uchun.


DROP operatori

DROP operatori yordamida jadvallarni yoki butun ma'lumotlar bazasini o'chirish mumkin. Masalan, agar biz users jadvalini butunlay o'chirmoqchi bo'lsak:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Jadvalni o'chirish
cursor.execute("DROP TABLE IF EXISTS users")

conn.commit()
conn.close()

Bu kodda users jadvali o'chiriladi. Eslatma: DROP operatori foydalanuvchilarning ma'lumotlarini qaytarib bo’lmaydigan qilib o'chiradi, shuning uchun ehtiyotkorlik bilan ishlash kerak.


ALTER TABLE operatori

ALTER TABLE operatori yordamida jadvalni o'zgartirish mumkin. Masalan, agar biz users jadvaliga yangi ustun qo'shmoqchi bo'lsak:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Yangi ustun qo'shish
cursor.execute("""
ALTER TABLE users
ADD COLUMN phone_number VARCHAR(15)
""")

conn.commit()
conn.close()

Bu kodda users jadvaliga phone_number nomli yangi ustun qo'shilyapti.


DISTINCT operatori

DISTINCT operatori bir xil qiymatlar takrorlanmasligini ta'minlash uchun ishlatiladi. Agar biz users jadvalidagi noyob email manzillarini olishni istasak, quyidagi so'rovni ishlatamiz:

conn = mysql.connector.connect(
host="localhost",
user="root",
password="yourpassword",
database="flask_example"
)
cursor = conn.cursor()

# Noyob email manzillarini olish
cursor.execute("SELECT DISTINCT email FROM users")
emails = cursor.fetchall()

for email in emails:
print(email)

conn.close()

Bu kodda faqat noyob email manzillari qaytariladi.


SQL agregat funktsiyalari

SQLda agregat funktsiyalar yordamida statistik ma'lumotlarni olish mumkin. Keling, har bir agregat funktsiyasini ko'rib chiqaylik.

SUM

Jadvaldagi sonli qiymatlarning yig'indisini olish uchun ishlatiladi. Misol uchun, orders jadvalidagi barcha buyurtmalar summasini olish uchun:

cursor.execute("SELECT SUM(amount) FROM orders")
total_amount = cursor.fetchone()[0]
print(f"Jami summa: {total_amount}")

COUNT

Jadvaldagi qatorlar sonini hisoblash uchun ishlatiladi. Masalan, users jadvalidagi foydalanuvchilar sonini olish uchun:

cursor.execute("SELECT COUNT(*) FROM users")
user_count = cursor.fetchone()[0]
print(f"Foydalanuvchilar soni: {user_count}")

LENGTH

Matnli ustunlardagi belgilar sonini hisoblash uchun ishlatiladi. Misol uchun:

cursor.execute("SELECT LENGTH(username) FROM users WHERE username = %s", ("abdullajon",))
username_length = cursor.fetchone()[0]
print(f"Username uzunligi: {username_length}")

MAX va MIN

Jadvaldagi eng katta yoki eng kichik qiymatni olish uchun ishlatiladi. Masalan, buyurtmalar bo'yicha eng katta va eng kichik summani olish uchun:

cursor.execute("SELECT MAX(amount) FROM orders")
max_amount = cursor.fetchone()[0]
print(f"Eng katta summa: {max_amount}")

cursor.execute("SELECT MIN(amount) FROM orders")
min_amount = cursor.fetchone()[0]
print(f"Eng kichik summa: {min_amount}")

ORDER BY operatori

ORDER BY operatori yordamida ma'lumotlarni tartiblash mumkin. Masalan, foydalanuvchilarni created_at ustuniga ko'ra saralash uchun quyidagi so'rovni yozamiz:

cursor.execute("SELECT * FROM users ORDER BY created_at DESC")
users = cursor.fetchall()

for user in users:
print(user)

Bu kodda foydalanuvchilar created_at bo'yicha kamayish tartibida saralanadi (DESC - kamayish tartibi, ASC - o'sish tartibi).


Flask dasturida murakkab SQL so'rovlarini yozish

INNER JOIN

Bir nechta jadvaldan ma'lumot olish uchun JOIN operatoridan foydalanish kerak. Misol uchun, bizda users va orders jadvali mavjud bo'lib, foydalanuvchilarning buyurtmalarini ko'rishni xohlaymiz.

SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Flask dasturida bu so'rovni quyidagicha yozish mumkin:

@app.route('/user_orders')
def user_orders():
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('''
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id
''')
orders = cursor.fetchall()
conn.close()
return str(orders)

Bu kod orqali foydalanuvchi nomlari va ularning buyurtmalarini ko'rsatishimiz mumkin.

GROUP BY va HAVING

Ma'lum bir mezon bo'yicha guruhlash uchun GROUP BY operatori ishlatiladi. Misol uchun, biz foydalanuvchilarning har biriga qancha buyurtma berilganini bilmoqchimiz.

SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 2;

Bu so'rovda biz faqat 2 ta va undan ortiq buyurtma berilgan foydalanuvchilarni ko'ramiz.

Flask kodida bu quyidagicha bo'ladi:

@app.route('/users_with_multiple_orders')
def users_with_multiple_orders():
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute('''
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 2
''')
result = cursor.fetchall()
conn.close()
return str(result)

Flask va MySQL bilan ishlashda muammolarni hal qilish

Muammolar:

  1. MySQL serveriga ulanmaslik: Ulanishning muvaffaqiyatsiz bo'lishi ko'plab sabablarga ko'ra yuz berishi mumkin. Serverning ishlamay qolishi, foydalanuvchi nomi yoki parolning noto'g'ri bo'lishi mumkin. MySQL loglarini tekshirib ko'ring.
  2. SQL sintaksis xatoliklari: SQL so'rovlarida sintaksis xatoliklari yuzaga kelishi mumkin. SQL so'rovlarini to'g'ri yozganingizga ishonch hosil qiling.
  3. Performance masalalari: Katta hajmdagi ma'lumotlar bilan ishlaganda, so'rovlar sekinlashishi mumkin. LIMIT, OFFSET yoki JOIN operatorlarini optimallashtirish yordamida buni hal qilish mumkin.

Xulosa

Bugun Flask va MySQL bilan ishlashda SQL komandalarini o'rgandik. Ma'lumotlar bazasini yaratish, jadval yaratish, ma'lumot kiritish, yangilash, filtrlash kabilar bo'yicha misollarni ko'rib chiqdik. Flask va MySQLning ushbu kombinatsiyasi dasturiy ta'minotlarni yaratishda keng qo'llaniladi va samarali ishlaydi.